home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / Basic / BlitzPlay / BlitzPlay.asc next >
Encoding:
Text File  |  1992-09-02  |  22.4 KB  |  869 lines

  1.  
  2. ;*****************************************************************
  3. ;*
  4. ;*  BlitzPlay History
  5. ;*
  6. ;*  V0:   Initial release
  7. ;*
  8. ;*****************************************************************
  9.  
  10. songnumadr.l=?SongNum
  11. maxsongadr.l=?MaxSong
  12. maxsong2adr.l=?MaxSong2
  13. fr_dataadr.l=?fr_data
  14. thxreplayeradr.l=?thxReplayer
  15. qcreplayadr.l=?QCReplay
  16. fucoreplayadr.l=?FUCOReplay
  17.  
  18. Function.s Check{}
  19.   SHARED maxsong2adr.l
  20.   header$=Left$(Peek.s(Start(0)),4)     ;What's the file header look like?
  21.   If header$="GMOD"                     ;Bugger supporting A or XMOD, I'll let somebody else do it :)
  22.     Function Return "GMOD"              ;Is it a GMOD?
  23.   EndIf                                 ;No, then have another fit.
  24.   If header$="THX"
  25.     Function Return "THX"
  26.   EndIf
  27.   If header$="FUCO"
  28.     If Peek.b(Start(0)+4)=-63
  29.       Function Return "FUCO"
  30.     EndIf
  31.   EndIf
  32.   If header$=""
  33.     Function Return "SID"               ;The only header info I have for PlaySID modules!
  34.   EndIf
  35.   If header$="FORM"
  36.     header$=Left$(Peek.s(Start(0)+8),8) ;What's the file header _really_ look like?
  37.     If header$="EMODEMIC"
  38.       If Peek.w(Start(0)+20)=1
  39.         Function Return "EMOD"
  40.       EndIf
  41.     Else
  42.       If header$="8SVXVHDR"
  43.         If Peek.l(Start(0)+16)=$14
  44.           Function Return "IFF"
  45.         EndIf
  46.       EndIf
  47.     EndIf
  48.   EndIf
  49.   If Left$(header$,3)="MMD"
  50.     Function Return "MED"
  51.   EndIf
  52.   If Peek.w(Start(0))=$4efa             ;Fred ?
  53.     If Peek.w(Start(0)+4)=$4efa         ;InitPlayer
  54.       If Peek.w(Start(0)+8)=$4efa       ;EndPlayer
  55.         If Peek.w(Start(0)+$c)=$4efa    ;FadeMusic
  56.           Function Return "FRED"        ;Module OK
  57.         EndIf
  58.       EndIf
  59.     EndIf
  60.   EndIf                                 ;Module not OK
  61.   If Peek.w(Start(0))=$48e7             ;Whittaker ?
  62.     If Peek.w(Start(0)+$e)=$48e7        ;InitPlayer
  63.       If Peek.w(Start(0)+$1c)=$48e7     ;Interrupt
  64.         If Peek.w(Start(0)+$2a)=$48e7   ;EndPlayer
  65.           If Peek.w(Start(0)+$38)=$48e7
  66.             If Peek.w(Start(0)+$46)=$48e7
  67.               Function Return "DWN"     ;Module OK
  68.             EndIf
  69.           EndIf
  70.         EndIf
  71.       EndIf
  72.     EndIf
  73.   EndIf                                 ;Module not OK
  74.   DecodeModule 0,Start(0)
  75.   If CheckTrackerID(0)
  76.     Function Return "MOD"
  77.   EndIf
  78.   FreeTrackerModule 0
  79.   Function Return ""
  80. End Function
  81.  
  82. Function.s Begin{name$}
  83.   SHARED numberofjumpadrs.b,modid$,songnumadr.l,thxreplayeradr.l,thxInitPlayer,qcreplayadr.l,sidplaybase.l,sidlen.l,sidadr.l
  84.   SHARED header.l
  85.   success.b=BLoad(name$,0,0,0,2)
  86.   If success=0 Then Function Return " "
  87.   modid$=Check{}
  88.   playadr.l=Start(0)                                    ;Yup, let's go the next step...
  89.   Select modid$
  90.     Case "GMOD"
  91.       Poke.l songnumadr,1
  92.       numberofjumpadrs=(Peek.l(playadr+$C)-$10)/4       ;Number of jump table entries
  93.     Case "SID"
  94.       sidlen.l=Length(0)
  95.       sidadr.l=AllocVec_(sidlen,2)
  96.       If sidadr=0 Then Pop Select:Function Return "File can't be opened!"
  97.       CopyMem_ Start(0),sidadr,sidlen
  98.       EraseAll
  99.       header.l=AllocVec_(4096,2)
  100.       If header=0 Then Pop Select:Function Return "Object could not be loaded."
  101.       sidplaybase.l=OpenLibrary_(Null("playsid.library"),1.1)
  102.       If sidplaybase=0 Then Pop Select:Function Return "sidplay.library v1.1+ NOT found."
  103.       MOVEM.l d0-d7/a0-a6,-(a7)
  104.       GetReg a6,sidplaybase
  105.       JSR -$1e(a6)
  106.       GetReg a6,sidplaybase
  107.       GetReg d0,50
  108.       JSR -$60(a6)
  109.       GetReg a6,sidplaybase
  110.       GetReg a0,Null(name$)
  111.       GetReg a1,header
  112.       JSR -$2a(a6)
  113.       MOVEM.l (a7)+,d0-d7/a0-a6
  114.     Case "IFF"
  115.       EraseAll
  116.       LoadSound 0,name$
  117.     Case "THX"
  118.       MOVEM.l d0-d7/a0-a6,-(a7)
  119.       MOVE.L #0,a0                                      ;auto-allocate public (MEMF_ANY) memory
  120.       MOVE.L #0,a1                                      ;auto-allocate chip  (MEMF_CHIP) memory
  121.       GetReg a2,thxreplayeradr+thxInitPlayer
  122.       JSR (a2)
  123.       MOVEM.l (a7)+,d0-d7/a0-a6
  124.     Case "MED"
  125.       SetMedVolume 63
  126.     Case "MOD"
  127.       TrackerVolume 63
  128.     Case "EMOD"
  129.       MOVEM.l d0-d7/a0-a6,-(a7)
  130.       MOVE.l #63,d0
  131.       MOVE.l #63,d1
  132.       MOVE.l #63,d2
  133.       GetReg a0,qcreplayadr
  134.       JSR $14(a0)
  135.       MOVEM.l (a7)+,d0-d7/a0-a6
  136.     Case ""
  137.       Erase 0
  138.       Pop Select
  139.       Function Return "Not a recognised module!"
  140.   End Select
  141.   Function Return ""
  142. End Function
  143.  
  144. Function.s CreatorID{}
  145.   SHARED modid$       ;Shouldn't be altered, except by Begin{}!
  146.   id$=modid$
  147.   Select modid$
  148.     Case "GMOD"
  149.       id$=Left$(Peek.s(Start(0)+4),4)
  150.     Case "SID"
  151.       id$="PSID"
  152.     Case "DWN"
  153.       id$="_DW_"
  154.     Case "FRED"
  155.       id$="Fred"
  156.     Case "EMOD"
  157.       id$="QuadraComposer"
  158.     Case "MOD"
  159.       id$=Left$(Peek.s(Start(0)+$438),4)
  160.   End Select
  161.   Function Return id$ ;What program was used to make the file?
  162. End Function
  163.  
  164. Function.s InitMusic{}
  165.   SHARED numberofjumpadrs.b,modid$,maxsongadr.l,maxsong2adr.l,fr_dataadr.l,thxInitModule,thxreplayeradr.l,qcreplayadr.l
  166.   SHARED sidplaybase.l,sidlen.l,header.l,sidadr.l
  167.   ret$=""
  168.   Select modid$
  169.     Case "GMOD"
  170.       initmusic.l=Start(0)+$10              ;InitMusic offset
  171.       noteplayer.l=Start(0)+$20             ;NotePlayer offset
  172.       If numberofjumpadrs>4
  173.         MOVEM.l d0-d7/a0-a6,-(a7)
  174.         GetReg a0,?GMODnoteplayer           ;Pointer to the noteplayer source
  175.         MOVE.l #0,D0
  176.         GetReg A1,noteplayer                ;Supply module with noteplayer pointer
  177.         JSR (A1)
  178.         MOVEM.l (a7)+,d0-d7/a0-a6
  179.       EndIf
  180.       MOVEM.l d0-d7/a0-a6,-(a7)
  181.       MOVE.l #0,D0
  182.       GetReg A1,initmusic
  183.       JSR (A1)                              ;Initialise the GMOD
  184.       PutReg D0,check.l
  185.       MOVEM.l (a7)+,d0-d7/a0-a6
  186.       If check>0                            ;Did it work?
  187.         ret$=Peek.s(check)
  188.         If ret$="" Then ret$="Undefined Error"
  189.       EndIf                                 ;Nope, then error me purple.
  190.     Case "EMOD"
  191.       MOVEM.l d0-d7/a0-a6,-(a7)
  192.       GetReg a0,Start(0)
  193.       GetReg d0,Length(0)
  194.       GetReg a1,qcreplayadr
  195.       JSR (a1)
  196.       PutReg d0,success.b
  197.       MOVEM.l (a7)+,d0-d7/a0-a6
  198.       If success Then ret$="Error"
  199.     Case "THX"
  200.       MOVEM.l d0-d7/a0-a6,-(a7)
  201.       GetReg a0,Start(0)
  202.       GetReg a2,thxreplayeradr+thxInitModule
  203.       JSR (a2)
  204.       MOVEM.l (a7)+,d0-d7/a0-a6
  205.     Case "SID"
  206.       MOVEM.l d0-d7/a0-a6,-(a7)
  207.       GetReg a6,sidplaybase
  208.       GetReg a0,header
  209.       GetReg a1,sidadr
  210.       GetReg d0,sidlen
  211.       JSR -$36(a6)
  212.       MOVEM.l (a7)+,d0-d7/a0-a6
  213.     Case "FRED"
  214.       Poke.l fr_dataadr.l,Start(0)
  215.       Poke.l maxsongadr,Peek.l(maxsong2adr) ;copy buffer
  216.     Case "MED"
  217.       DecodeMedModule 0,Start(0)
  218.   End Select
  219.   Function Return ret$
  220.  
  221. .GMODnoteplayer:
  222.   IncBin "bin/note.lib"
  223. End Function
  224.  
  225. Statement Finish{}
  226.   SHARED songnumadr.l,maxsongadr.l,maxsong2adr.l,modid$,sidplaybase.l,sidadr.l,header.l
  227.   Select modid$
  228.     Case "IFF"
  229.       Free Sound 0
  230.     Case "SID"
  231.       CloseLibrary_ sidplaybase
  232.       FreeVec_ sidadr
  233.       FreeVec_ header
  234.     Case "MED"
  235.       Free MedModule 0
  236.     Case "MOD"
  237.       FreeTrackerModule 0
  238.   End Select
  239.   EraseAll
  240.   Poke.l songnumadr,1
  241.   Poke.l maxsongadr,1
  242.   Poke.l maxsong2adr,1
  243. End Statement
  244.  
  245. Function.s StartMusic{}
  246.   SHARED modid$,songnumadr.l,thxInitSubSong,thxreplayeradr.l,qcreplayadr.l,fucoreplayadr.l,sidplaybase.l,fr_dataadr.l
  247.   Select modid$
  248.     Case "GMOD"
  249.       startmusic.l=Start(0)+$14       ;StartMusic offset
  250.       MOVEM.l d0-d7/a0-a6,-(a7)
  251.       GetReg d0,Peek.l(songnumadr)
  252.       SUB.l #1,d0
  253.       GetReg A1,startmusic
  254.       JSR (A1)                        ;And now we finally start playing!
  255.       MOVEM.l (a7)+,d0-d7/a0-a6
  256.     Case "EMOD"
  257.       MOVEM.l d0-d7/a0-a6,-(a7)
  258.       GetReg a0,qcreplayadr
  259.       JSR 4(a0)
  260.       MOVEM.l (a7)+,d0-d7/a0-a6
  261.     Case "DWN"
  262.       MOVEM.l d0-d7/a0-a6,-(a7)
  263.       GetReg a0,Start(0)
  264.       JSR (a0)
  265.       MOVEM.l (a7)+,d0-d7/a0-a6
  266.     Case "IFF"
  267.       LoopSound 0,3
  268.     Case "THX"
  269.       MOVEM.l d0-d7/a0-a6,-(a7)
  270.       GetReg d0,Peek.l(songnumadr)    ;subsong
  271.       MOVE.l #0,d1                    ;play immediately
  272.       GetReg a2,thxreplayeradr+thxInitSubSong
  273.       JSR (a2)
  274.       MOVEM.l (a7)+,d0-d7/a0-a6
  275.     Case "SID"
  276.       MOVEM.l d0-d7/a0-a6,-(a7)
  277.       GetReg a6,sidplaybase
  278.       GetReg d0,Peek.l(songnumadr)
  279.       JSR -$3c(a6)
  280.       PutReg d0,err.l
  281.       MOVEM.l (a7)+,d0-d7/a0-a6
  282.       If err=-3 Then Pop Select:Finish{}:Function Return "Could NOT allocate CIAA timer."
  283.     Case "FUCO"
  284.       MOVEM.l d0-d7/a0-a6,-(a7)
  285.       GetReg a0,Start(0)
  286.       GetReg a1,fucoreplayadr
  287.       JSR (a1)
  288.       MOVEM.l (a7)+,d0-d7/a0-a6
  289.     Case "FRED"
  290.       MOVEM.l d0-d7/a0-a6,-(a7)
  291.       GetReg d0,Peek.l(songnumadr)-1
  292.       GetReg a0,Peek.l(fr_dataadr)
  293.       JSR (a0)                        ;Init Sound
  294.       MOVEM.l (a7)+,d0-d7/a0-a6
  295.     Case "MED"
  296.       StartMedModule 0
  297.     Case "MOD"
  298.       success.b=StartTracker(0)
  299.       If success=0
  300.         Pop Select
  301.         Function Return "Not a valid module!"
  302.       EndIf
  303.   End Select
  304.   Function Return ""
  305. End Function
  306.  
  307. Statement StopMusic{}
  308.   SHARED modid$,fr_dataadr.l,thxStopSong,thxreplayeradr.l,qcreplayadr.l,fucoreplayadr.l,sidplaybase.l
  309.   Select modid$
  310.     Case "GMOD"
  311.       stopmusic.l=Start(0)+$18  ;StopMusic offset
  312.       MOVEM.l d0-d7/a0-a6,-(a7)
  313.       GetReg A1,stopmusic       ;Enough of that noise!
  314.       JSR (A1)                  ;Just stop, stop it, leave me alone!
  315.       MOVEM.l (a7)+,d0-d7/a0-a6
  316.     Case "SID"
  317.       MOVEM.l d0-d7/a0-a6,-(a7)
  318.       GetReg a6,sidplaybase
  319.       JSR -$42(a6)
  320.       MOVEM.l (a7)+,d0-d7/a0-a6
  321.     Case "IFF"
  322.       Volume 3,0
  323.     Case "FRED"
  324.       MOVEM.l d0-d7/a0-a6,-(a7)
  325.       MOVEQ #0,d1
  326.       GetReg a0,Peek.l(fr_dataadr)
  327.       JSR 8(a0)                 ;End Sound
  328.       MOVEQ #0,d0
  329.       LEA $dff000,a0
  330.       MOVE.w d0,$a8(a0)
  331.       MOVE.w d0,$b8(a0)
  332.       MOVE.w d0,$c8(a0)
  333.       MOVE.w d0,$d8(a0)
  334.       MOVE.w #$f,$96(a0)
  335.       MOVEM.l (a7)+,d0-d7/a0-a6
  336.     Case "DWN"
  337.       MOVEM.l d0-d7/a0-a6,-(a7)
  338.       GetReg a0,Start(0)
  339.       JSR $1c(a0)
  340.       MOVEM.l (a7)+,d0-d7/a0-a6
  341.     Case "EMOD"
  342.       MOVEM.l d0-d7/a0-a6,-(a7)
  343.       GetReg a0,qcreplayadr
  344.       JSR $c(a0)
  345.       MOVEM.l (a7)+,d0-d7/a0-a6
  346.     Case "FUCO"
  347.       MOVEM.l d0-d7/a0-a6,-(a7)
  348.       GetReg a0,fucoreplayadr
  349.       JSR 8(a0)
  350.       MOVEM.l (a7)+,d0-d7/a0-a6
  351.     Case "THX"
  352.       MOVEM.l d0-d7/a0-a6,-(a7)
  353.       GetReg a2,thxreplayeradr+thxStopSong
  354.       JSR (a2)
  355.       MOVEM.l (a7)+,d0-d7/a0-a6
  356.     Case "MED"
  357.       StopMed
  358.     Case "MOD"
  359.       PauseModule
  360.   End Select
  361. End Statement
  362.  
  363. Statement EndMusic{}
  364.   SHARED modid$,thxKillPlayer,thxreplayeradr.l,qcreplayadr.l,sidplaybase.l
  365.   Select modid$
  366.     Case "GMOD"
  367.       endmusic.l=Start(0)+$1C ;EndMusic offset
  368.       MOVEM.l d0-d7/a0-a6,-(a7)
  369.       GetReg A1,endmusic
  370.       JSR (A1)                ;A neat'n'tidy cleanup.
  371.       MOVEM.l (a7)+,d0-d7/a0-a6
  372.     Case "SID"
  373.       MOVEM.l d0-d7/a0-a6,-(a7)
  374.       GetReg a6,sidplaybase
  375.       JSR -$24(a6)
  376.       MOVEM.l (a7)+,d0-d7/a0-a6
  377.     Case "EMOD"
  378.       MOVEM.l d0-d7/a0-a6,-(a7)
  379.       GetReg a0,qcreplayadr
  380.       JSR $10(a0)
  381.       MOVEM.l (a7)+,d0-d7/a0-a6
  382.     Case "THX"
  383.       MOVEM.l d0-d7/a0-a6,-(a7)
  384.       GetReg a2,thxreplayeradr+thxKillPlayer
  385.       JSR (a2)
  386.       MOVEM.l (a7)+,d0-d7/a0-a6
  387.     Case "MOD"
  388.       StopTracker
  389.   End Select
  390. End Statement
  391.  
  392. Function.b ContinueMusic{}
  393.   SHARED numberofjumpadrs,modid$
  394.   success.b=0
  395.   Select modid$
  396.     Case "GMOD"
  397.       continuemusic.l=Start(0)+$24
  398.       If numberofjumpadrs>5
  399.         MOVEM.l d0-d7/a0-a6,-(a7)
  400.         MOVE.l #0,D0
  401.         GetReg A1,continuemusic
  402.         JSR (A1)
  403.         PutReg D0,success
  404.         MOVEM.l (a7)+,d0-d7/a0-a6
  405.       EndIf
  406.     Case "IFF"
  407.       Volume 3,63
  408.     Case "MOD"
  409.       PauseModule
  410.       success=True
  411.     Default
  412.       If StartMusic{}="" Then success=True
  413.   End Select
  414.   Function Return success
  415. End Function
  416.  
  417. Function.b TimerModes{}
  418.   SHARED modid$
  419.   timermodes.b=0
  420.   Select modid$
  421.     Case "GMOD"
  422.       vblank50.l=Start(0)+$28         ;VBlank50 offset
  423.       vblank60.l=Start(0)+$2C         ;VBlank60 offset
  424.       timertick.l=Start(0)+$50        ;TimerTick offset
  425.       tempnumber1.w=Peek.w(vblank50)  ;Which tempos are supported?
  426.       tempnumber2.w=Peek.w(vblank60)
  427.       tempnumber3.w=Peek.w(timertick)
  428.       If tempnumber1<>$4E75 Then timermodes+1
  429.       If tempnumber2<>$4E75 Then timermodes+2
  430.       If tempnumber3<>$4E75 Then timermodes+4
  431.     Default
  432.       timermodes=3
  433.   End Select
  434.   Function Return timermodes
  435. End Function
  436.  
  437. Function.b Interrupt{}
  438.   SHARED modid$,thxInterrupt,thxreplayeradr.l,qcreplayadr.l,fucoreplayadr.l,fr_dataadr.l
  439.   success=True
  440.   Select modid$
  441.     Case "FRED"
  442.       MOVEM.l d0-d7/a0-a6,-(a7)
  443.       GetReg a0,Peek.l(fr_dataadr)
  444.       JSR 4(a0) ;DudelDiDum
  445.       MOVEM.l (a7)+,d0-d7/a0-a6
  446.     Case "EMOD"
  447.       MOVEM.l d0-d7/a0-a6,-(a7)
  448.       GetReg a0,qcreplayadr
  449.       JSR 8(a0)
  450.       MOVEM.l (a7)+,d0-d7/a0-a6
  451.     Case "FUCO"
  452.       MOVEM.l d0-d7/a0-a6,-(a7)
  453.       GetReg a0,fucoreplayadr
  454.       JSR 4(a0)
  455.       MOVEM.l (a7)+,d0-d7/a0-a6
  456.     Case "THX"
  457.       MOVEM.l d0-d7/a0-a6,-(a7)
  458.       GetReg a2,thxreplayeradr+thxInterrupt
  459.       JSR (a2)
  460.       MOVEM.l (a7)+,d0-d7/a0-a6
  461.     Case "DWN"
  462.       MOVEM.l d0-d7/a0-a6,-(a7)
  463.       GetReg a0,Start(0)
  464.       JSR $e(a0)
  465.       MOVEM.l (a7)+,d0-d7/a0-a6
  466.     Case "MED"
  467.       PlayMed
  468.   End Select
  469.   Function Return success
  470. End Function
  471.  
  472. Function.b Vblank50{}
  473.   SHARED numberofjumpadrs,modid$
  474.   success.b=0
  475.   Select modid$
  476.     Case "GMOD"
  477.       vblank50.l=Start(0)+$28 ;VBlank50 offset
  478.       If numberofjumpadrs>6
  479.         MOVEM.l d0-d7/a0-a6,-(a7)
  480.         GetReg A1,vblank50    ;Actually PLAYS the MOD :)
  481.         JSR (A1)
  482.         MOVEM.l (a7)+,d0-d7/a0-a6
  483.         success=True
  484.       EndIf
  485.     Default
  486.       success=Interrupt{}
  487.   End Select
  488.   Function Return success
  489. End Function
  490.  
  491. Function.b Vblank60{}
  492.   SHARED numberofjumpadrs,modid$
  493.   success.b=0
  494.   Select modid$
  495.     Case "GMOD"
  496.       vblank60.l=Start(0)+$2C ;VBlank60 offset
  497.       If numberofjumpadrs>7
  498.         MOVEM.l d0-d7/a0-a6,-(a7)
  499.         GetReg A1,vblank60    ;Actually PLAYS the MOD :)
  500.         JSR (A1)
  501.         MOVEM.l (a7)+,d0-d7/a0-a6
  502.         success=True
  503.       EndIf
  504.     Default
  505.       success=Interrupt{}
  506.   End Select
  507.   Function Return success
  508. End Function
  509.  
  510. Function.b Channel0{}
  511.   SHARED numberofjumpadrs,modid$
  512.   Select modid$
  513.     Case "GMOD"
  514.       channel0.l=Start(0)+$30
  515.       If numberjumpadrs>8
  516.         MOVEM.l d0-d7/a0-a6,-(a7)
  517.         GetReg A1,channel0
  518.         JSR (A1)
  519.         MOVEM.l (a7)+,d0-d7/a0-a6
  520.         Pop Select
  521.         Function Return True
  522.       EndIf
  523.   End Select
  524.   Function Return False
  525. End Function
  526.  
  527. Function.b Channel1{}
  528.   SHARED numberofjumpadrs,modid$
  529.   Select modid$
  530.     Case "GMOD"
  531.       channel1.l=Start(0)+$34
  532.       If numberjumpadrs>9
  533.         MOVEM.l d0-d7/a0-a6,-(a7)
  534.         GetReg A1,channel1
  535.         JSR (A1)
  536.         MOVEM.l (a7)+,d0-d7/a0-a6
  537.         Pop Select
  538.         Function Return True
  539.       EndIf
  540.   End Select
  541.   Function Return False
  542. End Function
  543.  
  544. Function.b Channel2{}
  545.   SHARED numberofjumpadrs,modid$
  546.   Select modid$
  547.     Case "GMOD"
  548.       channel2.l=Start(0)+$38
  549.       If numberjumpadrs>10
  550.         MOVEM.l d0-d7/a0-a6,-(a7)
  551.         GetReg A1,channel2
  552.         JSR (A1)
  553.         MOVEM.l (a7)+,d0-d7/a0-a6
  554.         Pop Select
  555.         Function Return True
  556.       EndIf
  557.   End Select
  558.   Function Return False
  559. End Function
  560.  
  561. Function.b Channel3{}
  562.   SHARED numberofjumpadrs,modid$
  563.   Select modid$
  564.     Case "GMOD"
  565.       channel3.l=Start(0)+$3C
  566.       If numberjumpadrs>11
  567.         MOVEM.l d0-d7/a0-a6,-(a7)
  568.         GetReg A1,channel3
  569.         JSR (A1)
  570.         MOVEM.l (a7)+,d0-d7/a0-a6
  571.         Pop Select
  572.         Function Return True
  573.       EndIf
  574.   End Select
  575.   Function Return False
  576. End Function
  577.  
  578. Function.l GetNumSongs{}
  579.   SHARED numberofjumpadrs,modid$,maxsongadr.l,thxreplayeradr.l,thxBSS_P,thx_pSubsongs,header.l
  580.   success.l=1
  581.   Select modid$
  582.     Case "GMOD"
  583.       getnumsongs.l=Start(0)+$40
  584.       If numberofjumpadrs>12
  585.         MOVEM.l d0-d7/a0-a6,-(a7)
  586.         MOVE.l #1,D0
  587.         GetReg A1,getnumsongs
  588.         JSR (A1)
  589.         PutReg D0,success
  590.         MOVEM.l (a7)+,d0-d7/a0-a6
  591.       EndIf                                                   ;get ptr to
  592.     Case "THX"                                                ;players public memory
  593.       success=Peek.b(thxreplayeradr+thxBSS_P+thx_pSubsongs)   ;and get nr.  of
  594.     Case "FRED"                                               ;subsongs from there
  595.       success=Peek.l(maxsongadr)
  596.     Case "SID"
  597.       success=Peek.w(header+$e)                               ;I *think* this is right :)
  598.   End Select
  599.   Function Return success
  600. End Function
  601.  
  602. Statement SetSongNum{success.l}
  603.   SHARED songnumadr.l
  604.   Poke.l songnumadr,success
  605. End Statement
  606.  
  607. Function.s GetSongName{}
  608.   SHARED numberofjumpadrs,modid$,songnumadr.l,header.l
  609.   songname$=""
  610.   Select modid$
  611.     Case "GMOD"
  612.       getsongname.l=Start(0)+$44  ;GetSongName offset
  613.       If numberofjumpadrs>13      ;Checking to see if these functions actually exist!
  614.         MOVEM.l d0-d7/a0-a6,-(a7)
  615.         GetReg d0,Peek.l(songnumadr)
  616.         SUB.l #1,d0
  617.         GetReg A1,getsongname
  618.         JSR (A1)                  ;Is the song named?
  619.         PutReg D0,check.l
  620.         MOVEM.l (a7)+,d0-d7/a0-a6
  621.         If check>0                ;Apparently it is.
  622.           songname$=Peek.s(check)
  623.         EndIf
  624.       EndIf
  625.     Case "SID"
  626.       songname$=Peek.s(header+$16)
  627.     Case "MOD"
  628.       songname$=GetModuleName$(0)
  629.   End Select
  630.   Function Return songname$
  631. End Function
  632.  
  633. Function.s GetSongAuthor{}
  634.   SHARED numberofjumpadrs,modid$,header
  635.   songauthor$=""
  636.   Select modid$
  637.     Case "GMOD"
  638.       getsongauthor.l=Start(0)+$48  ;GetSongAuthor offset
  639.       If numberofjumpadrs>14
  640.         MOVEM.l d0-d7/a0-a6,-(a7)
  641.         GetReg d0,Peek.l(SongNum)
  642.         SUB.l #1,d0
  643.         GetReg A1,getsongauthor
  644.         JSR (A1)                    ;Have they given us an author name?
  645.         PutReg D0,check.l
  646.         MOVEM.l (a7)+,d0-d7/a0-a6
  647.         If check>0                  ;Sure have!
  648.           songauthor$=Peek.s(check)
  649.         EndIf
  650.       EndIf
  651.     Case "SID"
  652.       songauthor$=Peek.s(header+$36)
  653.     Case "FRED"
  654.       songauthor$="Frederic Hahn"
  655.     Case "DWN"
  656.       songauthor$="Dave Whittaker"
  657.   End Select
  658.   Function Return songauthor$
  659. End Function
  660.  
  661. Function.b GetFrequency{}
  662.   SHARED numberofjumpadrs,modid$
  663.   success.b=False
  664.   Select modid$
  665.     Case "GMOD"
  666.       getfrequency.l=Start(0)+$4C
  667.       If numberofjumpadrs>15
  668.         MOVEM.l d0-d7/a0-a6,-(a7)
  669.         MOVE.l #0,D0
  670.         GetReg A1,getfrequency
  671.         JSR (A1)
  672.         PutReg D0,success
  673.         MOVEM.l (a7)+,d0-d7/a0-a6
  674.       EndIf
  675.   End Select
  676.   Function Return success
  677. End Function
  678.  
  679. Function.b TimerTick{}
  680.   SHARED numberofjumpadrs,modid$
  681.   Select modid$
  682.     Case "GMOD"
  683.       timertick.l=Start(0)+$50  ;TimerTick offset
  684.       If numberofjumpadrs>16
  685.         MOVEM.l d0-d7/a0-a6,-(a7)
  686.         GetReg A1,timertick     ;Actually PLAYS the MOD :)
  687.         JSR (A1)
  688.         MOVEM.l (a7)+,d0-d7/a0-a6
  689.         Pop Select
  690.         Function Return True
  691.       EndIf
  692.   End Select
  693.   Function Return False
  694. End Function
  695.  
  696. Function.s GetMakerName{}
  697.   SHARED numberofjumpadrs,modid$
  698.   title$=""
  699.   Select modid$
  700.     Case "GMOD"
  701.       getmakername.l=Start(0)+$54 ;GetMakerName offset
  702.       If numberofjumpadrs>17
  703.         MOVEM.l d0-d7/a0-a6,-(a7)
  704.         MOVE.l #0,D0
  705.         GetReg A1,getmakername
  706.         JSR (A1)                  ;And what helped create this song?
  707.         PutReg D0,check.l
  708.         MOVEM.l (a7)+,d0-d7/a0-a6
  709.         If check>0
  710.           title$=Peek.s(check)
  711.         EndIf
  712.       EndIf
  713.     Case "FRED"
  714.       title$="FredMonitor"
  715.     Case "EMOD"
  716.       title$="QuadraComposer 2.1"
  717.     Case "FUCO"
  718.       title$="Future Composer v1.02"
  719.   End Select
  720.   Function Return title$
  721. End Function
  722.  
  723. Function.l Hook{HookFlags.l,HookStructure.l}
  724.   SHARED numberofjumpadrs,modid$
  725.   success.l=0
  726.   Select modid$
  727.     Case "GMOD"
  728.       hook.l=Start(0)+$58
  729.       If numberofjumpadrs>18
  730.         MOVEM.l d0-d7/a0-a6,-(a7)
  731.         MOVE.l #0,D0
  732.         GetReg D1,HookFlags
  733.         GetReg A0,HookStructure
  734.         GetReg A1,hook
  735.         JSR (A1)
  736.         PutReg D0,success
  737.         MOVEM.l (a7)+,d0-d7/a0-a6
  738.       EndIf
  739.   End Select
  740.   Function Return success
  741. End Function
  742.  
  743. Function.b Jump{Position.l}
  744.   SHARED numberofjumpadrs,modid$
  745.   success.b=0
  746.   Select modid$
  747.     Case "GMOD"
  748.       jump.l=Start(0)+$5C
  749.       If numberofjumpadrs>19
  750.         MOVEM.l d0-d7/a0-a6,-(a7)
  751.         MOVE.l #0,D0
  752.         GetReg D1,Position
  753.         GetReg A1,jump
  754.         JSR (A1)
  755.         PutReg D0,success
  756.         MOVEM.l (a7)+,d0-d7/a0-a6
  757.       EndIf
  758.     Case "MED"
  759.       JumpMed Position
  760.       success=True
  761.     Case "MOD"
  762.       ModulePositionJump Position
  763.       success=True
  764.   End Select
  765.   Function Return success
  766. End Function
  767.  
  768. Function.b SetVolume{Left.l,Right.l}
  769.   SHARED numberofjumpadrs,modid$,thx_pMainVolume,thxreplayeradr.l,thxBSS_P,qcreplayadr.l
  770.   success.b=0
  771.   Select modid$
  772.     Case "GMOD"
  773.       setvolume.l=Start(0)+$60
  774.       If numberofjumpadrs>20
  775.         MOVEM.l d0-d7/a0-a6,-(a7)
  776.         GetReg D0,Left
  777.         GetReg D1,Right
  778.         GetReg A1,setvolume
  779.         JSR (A1)
  780.         MOVEM.l (a7)+,d0-d7/a0-a6
  781.         success=True
  782.       EndIf
  783. ;    Case "FRED"
  784. ;      success=True
  785. ;      MOVEM.l d0-d7/a0-a6,-(a7)
  786. ;      MOVE.l fr_data(pc),a0
  787. ;      JSR 12(a0)  ;Seems to fade the music, there might be some other registers to effect it that I don't know about
  788. ;      MOVEM.l (a7)+,d0-d7/a0-a6
  789.     Case "EMOD"
  790.       MOVEM.l d0-d7/a0-a6,-(a7)
  791.       GetReg d2,((Left/4)+(Right/4))/2
  792.       GetReg a0,qcreplayadr
  793.       JSR $14(a0)
  794.       MOVEM.l (a7)+,d0-d7/a0-a6
  795.     Case "IFF"
  796.       Volume 1,Left/4
  797.       Volume 2,Right/4
  798.     Case "THX"
  799.       success=True
  800.       Poke.b thxreplayeradr+thxBSS_P+thx_pMainVolume,((Left/4)+(Right/4))/2
  801.     Case "MOD"
  802.       TrackerVolume ((Left/4)+(Right/4))/2
  803.       success=True
  804.     Case "MED"
  805.       SetMedVolume ((Left/4)+(Right/4))/2
  806.       success=True
  807.   End Select
  808.   Function Return success
  809. End Function
  810.  
  811. Function.s GetScroll{}
  812.   SHARED numberofjumpadrs,modid$  ;Look, but don't touch!
  813.   success$=""
  814.   Select modid$
  815.     Case "GMOD"
  816.       getscroll.l=Start(0)+$64
  817.       If numberofjumpadrs>21
  818.         MOVEM.l d0-d7/a0-a6,-(a7)
  819.         GetReg A1,getscroll
  820.         JSR (A1)
  821.         PutReg D0,check.l
  822.         MOVEM.l (a7)+,d0-d7/a0-a6
  823.         If check>0
  824.           success$=Peek.s(check)
  825.         EndIf
  826.       EndIf
  827.     Case "MOD"
  828.       For success.b=0 To 30
  829.         If ModuleSampleName(0,success)<>""
  830.           success$+ModuleSampleName(0,success)+" "
  831.         EndIf
  832.       Next
  833.   End Select
  834.   Function Return success$
  835. End Function
  836.  
  837. Goto endincludesource
  838.  
  839. .thxReplayer:
  840.   IncBin "bin/THX-Replayer.BIN"
  841.  
  842. .QCReplay:
  843.   IncBin "bin/QuadraComposer.bin"
  844.  
  845. .FUCOReplay:
  846.   IncBin "bin/FutureComposer.bin"
  847.  
  848. .SongNum:
  849.   Dc.l 1
  850.  
  851. .MaxSong:
  852.   Dc.l 1
  853.  
  854. .MaxSong2:
  855.   Dc.l 1
  856.  
  857. .fr_data:
  858.   Dc.l 0
  859.  
  860. Dc.b "$VER: BlitzPlay v0 1997 Toby Zuijdveld"
  861. Even
  862.  
  863. .endincludesource:
  864.  
  865. ;*****************************************************************
  866. ;*  The End
  867. ;*****************************************************************
  868.  
  869.